﻿using Microsoft.Extensions.DependencyInjection;
using RoslynProxy.Core;
using RoslynProxy.Core.RoslynProxyAttributes;

namespace RoslynCodeGenerator
{
    // 必须定义一个具有 partial 修饰符且继承自 RoslynProxyServiceCollection 的一个类型
    // 代码中不能定义多个继承自 RoslynProxyServiceCollection 的类型
    public partial class MyRoslynProxyServiceCollection : RoslynProxyServiceCollection
    {
    }

    public interface IMyService
    {
        void Show();
    }

    public class MyService : IMyService
    {
        void IMyService.Show()
        {
            Console.WriteLine("This is MyService.");
        }
    }

    // 只需要实现 RoslynDispatchProxy 类型，就可以自动代理 IMyService 接口
    // 不许要您手动注册服务 IMyService 服务，由 Roslyn 框架自动注册
    // 默认注册为瞬时服务
    //[ScopedRoslynProxy] 注册为作用域 
    [SingletonRoslynProxy] // 注册为单例
    public class MyServiceProxy : RoslynDispatchProxy<MyServiceProxy, IMyService, MyService>
    {
        protected override void BeginInvoke()
        {
            Console.WriteLine("MyServiceProxy BeginInvoke");
        }

        protected override void EndInvoke()
        {
            Console.WriteLine("MyServiceProxy EndInvoke");
        }
    }

    public partial class Program
    {
        static void Main(string[] args)
        {
            ServiceCollection services = new ServiceCollection();

            // 添加代理组件
            // 在这里会注册注册 MyServiceProxy 代理相关的服务
            services.AddProxyServices<MyRoslynProxyServiceCollection>();

            var provider = services.BuildServiceProvider();
            var servuce1 = provider.GetRequiredService<IMyService>();
            var servuce2 = provider.GetRequiredService<IMyService>();
            Console.WriteLine(servuce1 == servuce2);
            servuce2.Show();
        }
    }
}